home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #5 / Amiga Plus CD - 2000 - No. 5.iso / Tools / Dev / GameboyDev / GBDK / lib / drawing.s < prev    next >
Encoding:
Text File  |  1999-03-29  |  21.2 KB  |  1,834 lines

  1.     ;; Optimised Drawing library by Jon Fuge (jonny@q-continuum.demon.co.uk) based on original file
  2.     ;; Updates
  3.     ;;    990223    Michael        Removed mod_col, splitting it up into fg_colour, bg_colour, and draw_mode
  4.     ;;                Note:    some optimisations are available with unneded PUSH DE/POP DE's
  5.     .include        "global.s"
  6.  
  7.     .globl  .init_vram
  8.     .globl  .copy_vram
  9.  
  10.     .SOLID    =    0x00
  11.     .OR    =    0x01
  12.     .XOR    =    0x02
  13.     .AND    =    0x03
  14.  
  15.     .if    0
  16.     .SOLID    =    0x10
  17.     .OR    =    0x20
  18.     .XOR    =    0x40
  19.     .AND    =    0x80
  20.     .endif
  21.  
  22.     ;;  Format of mod_col
  23.     ;; 7 6 5 4 3 2 1 0
  24.     ;;   mode  fg  bg
  25.     .MAXCURSPOSX    = 0x13    ; In tiles
  26.     .MAXCURSPOSY    = 0x11
  27.  
  28.     .area   _HEADER (ABS)
  29.  
  30.     .org    .MODE_TABLE+4*.G_MODE
  31.     JP      .gmode
  32.  
  33.     .module Drawing1
  34.  
  35.     ;; Data
  36.     .area    _BSS
  37.     ;; Foreground drawing colour
  38. .fg_colour::    
  39.     .ds    1
  40.     ;; Background drawing colour
  41. .bg_colour::    
  42.     .ds    1
  43.     ;; Drawing mode (.SOILD etc)
  44. .draw_mode:
  45.     .ds    1
  46.     ;; Fill style
  47. .style:    
  48.     .ds    0x01
  49.     ;; Various varibles
  50. .x_s:    
  51.     .ds    2
  52. .y_s:    
  53.     .ds    2
  54. .delta_x:    
  55.     .ds    1
  56. .delta_y:    
  57.     .ds    1
  58. .inc:    
  59.     .ds    1
  60. .d:    
  61.     .ds    2
  62. .dinc1:    
  63.     .ds    2
  64. .dinc2:    
  65.     .ds    2
  66. .tx:    
  67.     .ds    1
  68. .ty:    
  69.     .ds    1
  70.     
  71.     .area   _CODE
  72.  
  73.     ;; Enter graphic mode
  74. .gmode::
  75.     DI            ; Disable interrupts
  76.  
  77.     ;; Turn the screen off
  78.     LDH    A,(.LCDC)
  79.     BIT    7,A
  80.     JR    Z,1$
  81.  
  82.     ;; Turn the screen off
  83.     CALL    .display_off
  84. 1$:
  85.     LD    HL,#0x8000+0x10*0x10
  86.     LD    DE,#0x1800-0x18*0x10
  87.     LD    B,#0x00
  88.     CALL    .init_vram    ; Init the charset at 0x8000
  89.  
  90.     ;; Install interrupt routines
  91.     LD    BC,#.vbl
  92.     CALL    .add_VBL
  93.     LD    BC,#.lcd
  94.     CALL    .add_LCD
  95.  
  96.     LD    A,#72        ; Set line at which LCD interrupt occurs
  97.     LDH    (.LYC),A
  98.  
  99.     LD    A,#0b01000100    ; Set LCD interrupt to occur when LY = LCY
  100.     LDH    (.STAT),A
  101.  
  102.     LDH    A,(.IE)
  103.     OR    #0b00000010    ; Enable LCD interrupt
  104.     LDH    (.IE),A
  105.  
  106.     ;; (9*20) = 180 tiles are used in the upper part of the screen
  107.     ;; (9*20) = 180 tiles are used in the lower part of the screen
  108.     ;; => We have 24 tiles free
  109.     ;; We keep 16 at 0x8000->0x80FF, and 8 at 0x9780->97FF
  110.  
  111.     LD    HL,#0x9800
  112.     LD    A,#0x10        ; Keep 16 tiles free
  113.     LD    BC,#12        ; 12 unused columns
  114.     LD    E,#18        ; 18 lines
  115. 2$:
  116.     LD    D,#20        ; 20 used columns
  117. 3$:
  118.     LD    (HL+),A
  119.     INC    A
  120.     DEC    D
  121.     JR    NZ,3$
  122.     ADD    HL,BC
  123.     DEC    E
  124.     JR    NZ,2$
  125.  
  126.     ;; Turn the screen on
  127.     LDH    A,(.LCDC)
  128.     OR    #0b10010001    ; LCD        = On
  129.                 ; BG Chr    = 0x8000
  130.                 ; BG        = On
  131.     AND    #0b11110111    ; BG Bank    = 0x9800
  132.     LDH    (.LCDC),A
  133.  
  134.     LD    A,#.G_MODE
  135.     LD    (.mode),A
  136.  
  137.     ;; Setup the default colours and draw modes
  138.     LD    A,#.SOLID
  139.     LD    (.draw_mode),A
  140.     LD    A,#0x03        ; Black
  141.     LD    (.fg_colour),A
  142.     LD    A,#0x00        ; White
  143.     LD    (.bg_colour),A
  144.     
  145.     EI            ; Enable interrupts
  146.  
  147.     RET
  148.  
  149. .vbl::
  150.     LDH    A,(.LCDC)
  151.     OR    #0b00010000    ; Set BG Chr to 0x8000
  152.     LDH    (.LCDC),A
  153.  
  154.     LD    A,#72        ; Set line at which LCD interrupt occurs
  155.     LDH    (.LYC),A
  156.  
  157.     RET
  158.  
  159.     ;; Is the STAT check required, as we are already in the HBL?
  160. .lcd::
  161. 1$:
  162.     LDH    A,(.STAT)
  163.     BIT    1,A
  164.     JR    NZ,1$
  165.  
  166.     LDH    A,(.LCDC)
  167.     AND    #0b11101111    ; Set BG Chr to 0x8800
  168.     LDH    (.LCDC),A
  169.  
  170.     RET
  171.  
  172.     ;; Draw a full-screen image at (BC)
  173. .draw_image::
  174.     LD      HL,#0x8000+0x10*0x10
  175.     LD      DE,#0x1680
  176.     CALL    .copy_vram      ; Move the charset
  177.     RET
  178.  
  179.     ;; Replace tile data at (B,C) with data at DE and store old value at HL
  180. .switch_data::
  181.     PUSH    DE              ; Save src
  182.     PUSH    HL              ; Save dst
  183.     LD      L,B
  184.     SLA     L
  185.     SLA     L
  186.     SLA     L
  187.     LD      H,#0x00
  188.     ADD     HL,HL
  189.     LD      D,H
  190.     LD      E,L
  191.  
  192.     LD      HL,#.y_table
  193.     SLA     C
  194.     SLA     C
  195.     SLA     C
  196.     LD      B,#0x00
  197.     ADD     HL,BC
  198.     ADD     HL,BC
  199.     LD      B,(HL)
  200.     INC     HL
  201.     LD      H,(HL)
  202.     LD      L,B
  203.     ADD     HL,DE
  204.  
  205.     LD      B,H             ; BC = src
  206.     LD      C,L
  207.     POP     HL              ; HL = dst
  208.     PUSH    BC              ; Save dst
  209.     LD      A,H
  210.     OR      L
  211.     JR      Z,1$
  212.     LD      DE,#0x10
  213.     CALL    .copy_vram
  214. 1$:
  215.     POP     HL              ; HL = dst
  216.     POP     BC              ; BC = src
  217.     LD      DE,#0x10
  218.     CALL    .copy_vram
  219.  
  220.     RET
  221.  
  222.     ;; Advance the cursor
  223. .adv_gcurs::
  224.     PUSH    HL
  225.     LD    HL,#.tx    ; X coordinate
  226.     LD    A,#.MAXCURSPOSX
  227.     CP    (HL)
  228.     JR    Z,1$
  229.     INC    (HL)
  230.     JR    99$
  231. 1$:
  232.     LD    (HL),#0x00
  233.     LD    HL,#.ty    ; Y coordinate
  234.     LD    A,#.MAXCURSPOSY
  235.     CP    (HL)
  236.     JR    Z,2$
  237.     INC    (HL)
  238.     JR    99$
  239. 2$:
  240.     LD    (HL),#0x00
  241. 99$:
  242.     POP    HL
  243.     RET
  244.  
  245.  
  246.     .area    _CODE
  247.  
  248.     ;; Draw a circle from (B,C) with radius D
  249. .circle::
  250.     LD    A,B    ;Store center values
  251.     LD    (.x_s),A
  252.     LD    A,C
  253.     LD    (.y_s),A
  254.  
  255.     XOR    A
  256.     LD    (.x_s+1),A 
  257.     LD    A,D
  258.     LD    (.y_s+1),A 
  259.     CPL
  260.     LD    L,A
  261.     LD    H,#0xFF
  262.     INC    HL
  263.     LD    BC,#0
  264.     ADD    HL,BC
  265.     LD    A,L
  266.     LD    (.d+1),A
  267.     LD    A,H
  268.     LD    (.d),A
  269.  
  270. cloop$:
  271.     LD    A,(.x_s+1)
  272.     LD    B,A
  273.     LD    A,(.y_s+1)
  274.     SUB    B
  275.     RET    C
  276.  
  277.     LD    A,(.style)
  278.     OR    A
  279.     CALL    Z,.circplot
  280.  
  281.     LD    A,(.d)
  282.     BIT    7,A
  283.     JR    Z,ycirc$
  284.  
  285.     LD    A,(.style)
  286.     OR    A
  287.     CALL    NZ,.horlin
  288.     LD    A,(.x_s+1)
  289.     INC    A
  290.     LD    (.x_s+1),A
  291.     LD    A,(.d)
  292.     LD    B,A
  293.     LD    A,(.d+1)
  294.     LD    C,A
  295.     LD    H,#0
  296.     LD    A,(.x_s+1)
  297.     LD    L,A
  298.     ADD    HL,HL
  299.     ADD    HL,HL
  300.     ADD    HL,BC
  301.     LD    BC,#6
  302.     ADD    HL,BC
  303.     LD    A,H
  304.     LD    (.d),A
  305.     LD    A,L
  306.     LD    (.d+1),A
  307.     JR    cloop$
  308. ycirc$:    
  309.     LD    A,(.style)
  310.     OR    A
  311.     CALL    NZ,.verlin
  312.     LD    A,(.x_s+1)
  313.     INC    A
  314.     LD    (.x_s+1),A
  315.     LD    B,#0
  316.     LD    A,(.x_s+1)
  317.     LD    C,A
  318.     LD    H,#0xFF
  319.     LD    A,(.y_s+1)
  320.     CPL
  321.     LD    L,A
  322.     INC    HL
  323.     ADD    HL,BC
  324.     LD    A,(.d)
  325.     LD    B,A
  326.     LD    A,(.d+1)
  327.     LD    C,A
  328.     ADD    HL,HL
  329.     ADD    HL,HL
  330.     ADD    HL,BC
  331.     LD    BC,#10
  332.     ADD    HL,BC
  333.     LD    A,H
  334.     LD    (.d),A
  335.     LD    A,L
  336.     LD    (.d+1),A
  337.     LD    A,(.y_s+1)
  338.     DEC    A
  339.     LD    (.y_s+1),A
  340.     JP    cloop$
  341.  
  342. .horlin::
  343.     LD    A,(.x_s)
  344.     LD    B,A
  345.     LD    A,(.y_s)
  346.     LD    C,A
  347.     LD    A,(.x_s+1)
  348.     LD    D,A
  349.     LD    A,(.y_s+1)
  350.     LD    E,A
  351.     PUSH    BC
  352.     PUSH    DE
  353.     LD    A,B
  354.     SUB    E
  355.     LD    H,A
  356.     LD    A,B
  357.     ADD    E
  358.     LD    B,A
  359.     LD    A,C
  360.     ADD    D
  361.     LD    C,A
  362.     LD    D,H
  363.     LD    E,C
  364.     CALL    .line
  365.     POP    DE
  366.     POP    BC
  367.     LD    A,D
  368.     OR    A
  369.     RET    Z
  370.     PUSH    BC
  371.     PUSH    DE
  372.     LD    A,B
  373.     SUB    E
  374.     LD    H,A
  375.     LD    A,B
  376.     ADD    E
  377.     LD    B,A
  378.     LD    A,C
  379.     SUB    D
  380.     LD    C,A
  381.     LD    D,H
  382.     LD    E,C
  383.     CALL    .line
  384.     POP    DE
  385.     POP    BC
  386.     RET
  387.  
  388. .verlin::
  389.     LD    A,(.x_s)
  390.     LD    B,A
  391.     LD    A,(.y_s)
  392.     LD    C,A
  393.     LD    A,(.x_s+1)
  394.     LD    D,A
  395.     LD    A,(.y_s+1)
  396.     LD    E,A
  397.     PUSH    BC
  398.     PUSH    DE
  399.     LD    A,B
  400.     SUB    E
  401.     LD    H,A
  402.     LD    A,B
  403.     ADD    E
  404.     LD    B,A
  405.     LD    A,C
  406.     ADD    D
  407.     LD    C,A
  408.     LD    D,H
  409.     LD    E,C
  410.     CALL    .line
  411.     POP    DE
  412.     POP    BC
  413.     PUSH    BC
  414.     PUSH    DE
  415.     LD    A,B
  416.     SUB    E
  417.     LD    H,A
  418.     LD    A,B
  419.     ADD    E
  420.     LD    B,A
  421.     LD    A,C
  422.     SUB    D
  423.     LD    C,A
  424.     LD    D,H
  425.     LD    E,C
  426.     CALL    .line
  427.     POP    DE
  428.     POP    BC
  429.     LD    A,D
  430.     SUB    E
  431.     RET    Z
  432.     PUSH    BC
  433.     PUSH    DE
  434.     LD    A,B
  435.     SUB    D
  436.     LD    H,A
  437.     LD    A,B
  438.     ADD    D
  439.     LD    B,A
  440.     LD    A,C
  441.     SUB    E
  442.     LD    C,A
  443.     LD    D,H
  444.     LD    E,C
  445.     CALL    .line
  446.     POP    DE
  447.     POP    BC
  448.     PUSH    BC
  449.     PUSH    DE
  450.     LD    A,B
  451.     SUB    D
  452.     LD    H,A
  453.     LD    A,B
  454.     ADD    D
  455.     LD    B,A
  456.     LD    A,C
  457.     ADD    E
  458.     LD    C,A
  459.     LD    D,H
  460.     LD    E,C
  461.     CALL    .line
  462.     POP    DE
  463.     POP    BC
  464.     RET
  465.  
  466. .circplot::
  467.     LD    A,(.x_s)
  468.     LD    B,A
  469.     LD    A,(.y_s)
  470.     LD    C,A
  471.     LD    A,(.x_s+1)
  472.     LD    D,A
  473.     LD    A,(.y_s+1)
  474.     LD    E,A
  475.     PUSH    BC
  476.     PUSH    DE
  477.     LD    A,B
  478.     ADD    D
  479.     LD    B,A
  480.     LD    A,C
  481.     SUB    E
  482.     LD    C,A
  483.     CALL    .plot
  484.     POP    DE
  485.     POP    BC
  486.     PUSH    BC
  487.     PUSH    DE
  488.     LD    A,B
  489.     SUB    E
  490.     LD    B,A
  491.     LD    A,C
  492.     SUB    D
  493.     LD    C,A
  494.     CALL    .plot
  495.     POP    DE
  496.     POP    BC
  497.     PUSH    BC
  498.     PUSH    DE
  499.     LD    A,B
  500.     SUB    D
  501.     LD    B,A
  502.     LD    A,C
  503.     ADD    E
  504.     LD    C,A
  505.     CALL    .plot
  506.     POP    DE
  507.     POP    BC
  508.     PUSH    BC
  509.     PUSH    DE
  510.     LD    A,B
  511.     ADD    E
  512.     LD    B,A
  513.     LD    A,C
  514.     ADD    D
  515.     LD    C,A
  516.     CALL    .plot
  517.     POP    DE
  518.     POP    BC
  519.     
  520.     LD    A,D
  521.     OR    A
  522.     RET    Z
  523.     SUB    E
  524.     RET    Z
  525.  
  526.     PUSH    BC
  527.     PUSH    DE
  528.     LD    A,B
  529.     SUB    D
  530.     LD    B,A
  531.     LD    A,C
  532.     SUB    E
  533.     LD    C,A
  534.     CALL    .plot
  535.     POP    DE
  536.     POP    BC
  537.     PUSH    BC
  538.     PUSH    DE
  539.     LD    A,B
  540.     SUB    E
  541.     LD    B,A
  542.     LD    A,C
  543.     ADD    D
  544.     LD    C,A
  545.     CALL    .plot
  546.     POP    DE
  547.     POP    BC
  548.     PUSH    BC
  549.     PUSH    DE
  550.     LD    A,B
  551.     ADD    D
  552.     LD    B,A
  553.     LD    A,C
  554.     ADD    E
  555.     LD    C,A
  556.     CALL    .plot
  557.     POP    DE
  558.     POP    BC
  559.     PUSH    BC
  560.     PUSH    DE
  561.     LD    A,B
  562.     ADD    E
  563.     LD    B,A
  564.     LD    A,C
  565.     SUB    D
  566.     LD    C,A
  567.     CALL    .plot
  568.     POP    DE
  569.     POP    BC
  570.     RET
  571.  
  572.     ;; Draw a box between (B,C) and (D,E)
  573. .box::
  574.     LD    A,(.x_s)
  575.     LD    B,A
  576.     LD    A,(.x_s+1)
  577.     LD    C,A
  578.     SUB    B
  579.     JR    NC,ychk$
  580.     LD    A,C
  581.     LD    (.x_s),A
  582.     LD    A,B
  583.     LD    (.x_s+1),A
  584. ychk$:
  585.     LD    A,(.y_s)
  586.     LD    B,A
  587.     LD    A,(.y_s+1)
  588.     LD    C,A
  589.     SUB    B
  590.     JR    NC,dbox$
  591.     LD    A,C
  592.     LD    (.y_s),A
  593.     LD    A,B
  594.     LD    (.y_s+1),A
  595. dbox$:
  596.     LD    A,(.x_s)
  597.     LD    B,A
  598.     LD    D,A
  599.     LD    A,(.y_s)
  600.     LD    C,A
  601.     LD    A,(.y_s+1)
  602.     LD    E,A
  603.     CALL    .line
  604.     LD    A,(.x_s+1)
  605.     LD    B,A
  606.     LD    D,A
  607.     LD    A,(.y_s)
  608.     LD    C,A
  609.     LD    A,(.y_s+1)
  610.     LD    E,A
  611.     CALL    .line
  612.     LD    A,(.x_s)
  613.     INC    A
  614.     LD    (.x_s),A
  615.     LD    A,(.x_s+1)
  616.     DEC    A
  617.     LD    (.x_s+1),A
  618.     LD    A,(.x_s)
  619.     LD    B,A
  620.     LD    A,(.x_s+1)
  621.     LD    D,A
  622.     LD    A,(.y_s)
  623.     LD    C,A
  624.     LD    E,A
  625.     CALL    .line
  626.     LD    A,(.x_s)
  627.     LD    B,A
  628.     LD    A,(.x_s+1)
  629.     LD    D,A
  630.     LD    A,(.y_s+1)
  631.     LD    C,A
  632.     LD    E,A
  633.     CALL    .line
  634.     LD    A,(.style)
  635.     OR    A
  636.     RET    Z
  637.     LD    A,(.x_s)
  638.     LD    B,A
  639.     LD    A,(.x_s+1)
  640.     SUB    B
  641.     RET    C
  642.     LD    A,(.y_s)
  643.     INC    A
  644.     LD    (.y_s),A
  645.     LD    A,(.y_s+1)
  646.     DEC    A
  647.     LD    (.y_s+1),A
  648.     LD    A,(.y_s)
  649.     LD    B,A
  650.     LD    A,(.y_s+1)
  651.     SUB    B
  652.     RET    C
  653.  
  654.     .if    0
  655.     LD    A,(.mod_col)    ;Swap fore + back colours.
  656.     LD    D,A
  657.     AND    #0xF0
  658.     LD    C,A        ;Preserve Style
  659.     LD    A,D
  660.     AND    #0x0C
  661.     RRCA
  662.     RRCA
  663.     OR    C        ;Foreground->background + style
  664.     LD    C,A
  665.     LD    A,D
  666.     AND    #0x03
  667.     RLCA
  668.     RLCA
  669.     OR    C
  670.     LD    (.mod_col),A
  671.     .else
  672.     LD    A,(.fg_colour)
  673.     LD    C,A
  674.     LD    A,(.bg_colour)
  675.     LD    (.fg_colour),A
  676.     LD    A,C
  677.     LD    (.bg_colour),A
  678.     .endif 
  679. filllp$:
  680.     LD    A,(.x_s)
  681.     LD    B,A
  682.     LD    A,(.x_s+1)
  683.     LD    D,A
  684.     LD    A,(.y_s)
  685.     LD    C,A
  686.     LD    E,A
  687.     CALL    .line
  688.     LD    A,(.y_s+1)
  689.     LD    B,A
  690.     LD    A,(.y_s)
  691.     CP    B
  692.     JR    Z,swap$
  693.     INC    A
  694.     LD    (.y_s),A
  695.     JR    filllp$
  696. swap$:    
  697.     .if    0
  698.     LD    A,(.mod_col)    ;Swap fore + back colours.
  699.     LD    D,A
  700.     AND    #0xF0
  701.     LD    C,A        ;Preserve Style
  702.     LD    A,D
  703.     AND    #0x0C
  704.     RRCA
  705.     RRCA
  706.     OR    C        ;Foreground->background + style
  707.     LD    C,A
  708.     LD    A,D
  709.     AND    #0x03
  710.     RLCA
  711.     RLCA
  712.     OR    C
  713.     LD    (.mod_col),A
  714.     .else
  715.     LD    A,(.fg_colour)
  716.     LD    C,A
  717.     LD    A,(.bg_colour)
  718.     LD    (.fg_colour),A
  719.     LD    A,C
  720.     LD    (.bg_colour),A
  721.     .endif
  722.     RET
  723.  
  724.     ;; Draw a line between (B,C) and (D,E)
  725. .line::
  726.     LD    A,C    ;Calculate Delta Y
  727.     SUB    E
  728.     JR    NC,s1$
  729.     CPL
  730.     INC    A
  731. s1$:    LD    (.delta_y),A
  732.     LD    H,A
  733.  
  734.     LD    A,B    ;Calculate Delta X
  735.     SUB    D
  736.     JR    NC,s2$
  737.     CPL
  738.     INC    A
  739. s2$:    LD    (.delta_x),A
  740.  
  741.     SUB    H
  742.     JP    C,y1$
  743.  
  744.     ;; Use Delta X
  745.  
  746.     LD    A,B
  747.     SUB    D
  748.     JP    NC,x2$
  749.  
  750.     LD    A,C
  751.     SUB    E
  752.     JR    Z,x3$
  753.     LD    A,#0x00
  754.     JR    NC,x3$
  755.     LD    A,#0xFF
  756.     JR    x3$
  757.  
  758. x2$:
  759.     LD    A,E
  760.     SUB    C
  761.     JR    Z,x2a$
  762.     LD    A,#0x00
  763.     JR    NC,x2a$
  764.     LD    A,#0xFF
  765.  
  766. x2a$:
  767.     LD    B,D
  768.     LD    C,E    ;BC holds start X,Y
  769. x3$:
  770.     LD    (.inc),A    ;Store Y increment
  771.     LD    HL,#.y_table
  772.     LD    D,#0x00
  773.     LD    E,C
  774.     ADD    HL,DE
  775.     ADD    HL,DE
  776.     LD    A,(HL+)
  777.     LD    H,(HL)
  778.     LD    L,A
  779.  
  780.     LD    A,B
  781.     AND    #0xf8
  782.     LD    E,A
  783.     ADD    HL,DE
  784.     ADD    HL,DE
  785.  
  786.     LD    A,(.delta_y)
  787.     OR    A
  788.     JP    Z,.xonly
  789.  
  790.     ;;    Got to do it the hard way.
  791.  
  792.     ;    Calculate (2*deltay) -> dinc1
  793.  
  794.     PUSH    HL
  795.     LD    H,#0x00
  796.     LD    L,A
  797.     ADD    HL,HL
  798.     LD    A,H
  799.     LD    (.dinc1),A
  800.     LD    A,L
  801.     LD    (.dinc1+1),A
  802.  
  803.     ;    Calculate (2*deltay)-deltax -> d
  804.  
  805.  
  806.     LD    D,H
  807.     LD    E,L
  808.     LD    A,(.delta_x)
  809.     CPL
  810.     LD    L,A
  811.     LD    H,#0xFF
  812.     INC    HL
  813. dx1$:
  814.     ADD    HL,DE
  815.     LD    A,H
  816.     LD    (.d),A
  817.     LD    A,L
  818.     LD    (.d+1),A
  819.  
  820.     ;    Calculate (deltay-deltax)*2 -> dinc2
  821.  
  822.     LD    A,(.delta_x)
  823.     CPL
  824.     LD    L,A
  825.     LD    H,#0xFF
  826.     INC    HL
  827.     LD    A,(.delta_y)
  828.     LD    D,#0x00
  829.     LD    E,A
  830.     ADD    HL,DE
  831.     ADD    HL,HL
  832.  
  833.     LD    A,H
  834.     LD    (.dinc2),A
  835.     LD    A,L
  836.     LD    (.dinc2+1),A
  837.  
  838.     POP    HL
  839.  
  840.     .if    0
  841.     LD    A,(.mod_col)
  842.     LD    D,A
  843.     .endif
  844.     
  845.     LD    A,(.delta_x)
  846.     LD    E,A
  847.  
  848.     LD    A,B
  849.     AND    #7
  850.     ADD    #0x10    ; Table of bits is located at 0x0010
  851.     LD    C,A
  852.     LD    B,#0x00
  853.     LD    A,(BC)    ; Get start bit
  854.     LD    B,A
  855.     LD    C,A
  856.  
  857. xloop$:
  858.     RRC    C
  859.     LD    A,(.d)
  860.     BIT    7,A
  861.     JR    Z,ychg$
  862.     PUSH    DE
  863.     BIT    7,C
  864.     JR    Z,nbit$
  865.     LD    A,B
  866.     CPL
  867.     LD    C,A
  868.     CALL    .wrbyte
  869.     DEC    HL
  870.     LD    C,#0x80
  871.     LD    B,C
  872. nbit$:
  873.     LD    A,(.d+1)
  874.     LD    D,A
  875.     LD    A,(.dinc1+1)
  876.     ADD    D
  877.     LD    (.d+1),A
  878.     LD    A,(.d)
  879.     LD    D,A
  880.     LD    A,(.dinc1)
  881.     ADC    D
  882.     LD    (.d),A
  883.     POP    DE
  884.     JR    nchg$
  885. ychg$:
  886.     PUSH    DE
  887.     PUSH    BC
  888.     LD    A,B
  889.     CPL
  890.     LD    C,A
  891.     CALL    .wrbyte
  892.     LD    A,(.inc)
  893.     OR    A
  894.     JR    Z,ydown$
  895.     INC    HL
  896.     LD    A,L
  897.     AND    #0x0F
  898.     JR    NZ,bound$
  899.     LD    DE,#0x0130
  900.     ADD    HL,DE    ;Correct screen address
  901.     JR    bound$
  902. ydown$:
  903.     DEC    HL
  904.     DEC    HL
  905.     DEC    HL
  906.     LD    A,L
  907.     AND    #0x0F
  908.     XOR    #0x0E
  909.     JR    NZ,bound$
  910.     LD    DE,#0xFED0
  911.     ADD    HL,DE    ;Correct screen address
  912. bound$:
  913.     LD    A,(.d+1)
  914.     LD    D,A
  915.     LD    A,(.dinc2+1)
  916.     ADD    D
  917.     LD    (.d+1),A
  918.     LD    A,(.d)
  919.     LD    D,A
  920.     LD    A,(.dinc2)
  921.     ADC    D
  922.     LD    (.d),A
  923.     POP    BC
  924.     LD    B,C
  925.     POP    DE
  926. nchg$:
  927.     BIT    7,C
  928.     JR    Z,nadj$
  929.     PUSH    DE
  930.     LD    DE,#0x0010
  931.     ADD    HL,DE    ;Correct screen address
  932.     POP    DE
  933.     LD    B,C
  934. nadj$:
  935.     LD    A,B
  936.     OR    C
  937.     LD    B,A
  938.     DEC    E
  939.     JP    NZ,xloop$
  940.     LD    A,B
  941.     CPL
  942.     LD    C,A
  943.     JP    .wrbyte
  944.  
  945. .xonly::
  946.     ;; Draw accelerated horizontal line
  947.     .if    0
  948.     ;; xxx needed?
  949.     LD    A,(.mod_col)    
  950.     LD    D,A
  951.     .endif
  952.  
  953.     LD    A,(.delta_x)
  954.     LD    E,A
  955.     INC    E
  956.  
  957.     LD    A,B    ;check X
  958.     AND    #7    ;just look at bottom 3 bits
  959.     JR    Z,2$
  960.     PUSH    HL
  961.     ADD    #0x10    ;Table of bits is located at 0x0010
  962.     LD    L,A
  963.     LD    H,#0x00
  964.     LD    C,(HL)
  965.     POP    HL
  966.     XOR    A    ;Clear A
  967. 1$:    RRCA        ;Shift data right 1
  968.     OR    C
  969.     DEC    E
  970.     JR    Z,3$
  971.     BIT    0,A
  972.     JR    Z,1$
  973.     JR    3$
  974. 2$:
  975.     LD    A,E
  976.     DEC    A
  977.     AND    #0xF8
  978.     JR    Z,4$
  979.     JR    8$
  980. 3$:
  981.     LD    B,A
  982.     CPL
  983.     LD    C,A
  984.     PUSH    DE
  985.     CALL    .wrbyte
  986.     LD    DE,#0x0F
  987.     ADD    HL,DE    ;Correct screen address
  988.     POP    DE
  989.  
  990. 8$:    LD    A,E
  991.     OR    A
  992.     RET    Z
  993.     AND    #0xF8
  994.     JR    Z,4$
  995.  
  996.     XOR    A
  997.     LD    C,A
  998.     CPL
  999.     LD    B,A
  1000.  
  1001.     PUSH    DE
  1002.     CALL    .wrbyte
  1003.     LD    DE,#0x0F
  1004.     ADD    HL,DE    ;Correct screen address
  1005.     POP    DE
  1006.     LD    A,E
  1007.     SUB    #8
  1008.     RET    Z
  1009.     LD    E,A
  1010.     JR    8$
  1011.  
  1012. 4$:    LD    A,#0x80
  1013. 5$:    DEC    E
  1014.     JR    Z,6$
  1015.     SRA    A
  1016.     JR    5$
  1017. 6$:    LD    B,A
  1018.     CPL
  1019.     LD    C,A
  1020.     JP    .wrbyte
  1021.  
  1022.     ;; Use Delta Y
  1023. y1$:
  1024.     LD    A,C
  1025.     SUB    E
  1026.     JP    NC,y2$
  1027.  
  1028.     LD    A,B
  1029.     SUB    D
  1030.     JR    Z,y3$
  1031.     LD    A,#0x00
  1032.     JR    NC,y3$
  1033.     LD    A,#0xFF
  1034.     JR    y3$
  1035.  
  1036. y2$:
  1037.     LD    A,C
  1038.     SUB    E
  1039.     JR    Z,y2a$
  1040.     LD    A,#0x00
  1041.     JR    NC,y2a$
  1042.     LD    A,#0xFF
  1043.  
  1044. y2a$:
  1045.     LD    B,D
  1046.     LD    C,E    ;BC holds start X,Y
  1047.  
  1048. y3$:
  1049.     LD    (.inc),A    ;Store X increment
  1050.     LD    HL,#.y_table
  1051.     LD    D,#0x00
  1052.     LD    E,C
  1053.     ADD    HL,DE
  1054.     ADD    HL,DE
  1055.     LD    A,(HL+)
  1056.     LD    H,(HL)
  1057.     LD    L,A
  1058.  
  1059.     LD    A,B
  1060.     AND    #0xf8
  1061.     LD    E,A
  1062.     ADD    HL,DE
  1063.     ADD    HL,DE
  1064.  
  1065.     .if    0
  1066.     ;; Trashed by later instructions
  1067.     LD    A,(.mod_col)
  1068.     LD    D,A
  1069.     .endif
  1070.     
  1071.     LD    A,(.delta_y)
  1072.     LD    E,A
  1073.     INC    E
  1074.  
  1075.     LD    A,(.delta_x)
  1076.     OR    A
  1077.     JP    Z,.yonly
  1078.  
  1079.     ;;    Got to do it the hard way.
  1080.  
  1081.     ;    Calculate (2*deltax) -> dinc1
  1082.  
  1083.     PUSH    HL
  1084.     LD    H,#0x00
  1085.     LD    L,A
  1086.     ADD    HL,HL
  1087.     LD    A,H
  1088.     LD    (.dinc1),A
  1089.     LD    A,L
  1090.     LD    (.dinc1+1),A
  1091.  
  1092.     ;    Calculate (2*deltax)-deltay -> d
  1093.  
  1094.  
  1095.     LD    D,H
  1096.     LD    E,L
  1097.     LD    A,(.delta_y)
  1098.     CPL
  1099.     LD    L,A
  1100.     LD    H,#0xFF
  1101.     INC    HL
  1102. dy1$:
  1103.     ADD    HL,DE
  1104.     LD    A,H
  1105.     LD    (.d),A
  1106.     LD    A,L
  1107.     LD    (.d+1),A
  1108.  
  1109.     ;    Calculate (deltax-deltay)*2 -> dinc2
  1110.  
  1111.     LD    A,(.delta_y)
  1112.     CPL
  1113.     LD    L,A
  1114.     LD    H,#0xFF
  1115.     INC    HL
  1116.     LD    A,(.delta_x)
  1117.     LD    D,#0x00
  1118.     LD    E,A
  1119.     ADD    HL,DE
  1120.     ADD    HL,HL
  1121.  
  1122.     LD    A,H
  1123.     LD    (.dinc2),A
  1124.     LD    A,L
  1125.     LD    (.dinc2+1),A
  1126.  
  1127.     POP    HL
  1128.  
  1129.     .if    0
  1130.     ;; xxx Not used?
  1131.     LD    A,(.mod_col)
  1132.     LD    D,A
  1133.     .endif
  1134.  
  1135.     LD    A,(.delta_y)
  1136.     LD    E,A
  1137.  
  1138.     LD    A,B
  1139.     AND    #7
  1140.     ADD    #0x10    ; Table of bits is located at 0x0010
  1141.     LD    C,A
  1142.     LD    B,#0x00
  1143.     LD    A,(BC)    ; Get start bit
  1144.     LD    B,A
  1145.     LD    C,A
  1146.  
  1147. yloop$:
  1148.     PUSH    DE
  1149.     PUSH    BC
  1150.     LD    A,B
  1151.     CPL
  1152.     LD    C,A
  1153.     CALL    .wrbyte
  1154.     INC    HL
  1155.     LD    A,L
  1156.     AND    #0x0F
  1157.     JR    NZ,nybound$
  1158.     LD    DE,#0x0130
  1159.     ADD    HL,DE    ;Correct screen address
  1160. nybound$:
  1161.     POP    BC
  1162.     LD    A,(.d)
  1163.     BIT    7,A
  1164.     JR    Z,xchg$
  1165.     LD    A,(.d+1)
  1166.     LD    D,A
  1167.     LD    A,(.dinc1+1)
  1168.     ADD    D
  1169.     LD    (.d+1),A
  1170.     LD    A,(.d)
  1171.     LD    D,A
  1172.     LD    A,(.dinc1)
  1173.     ADC    D
  1174.     LD    (.d),A
  1175.     JR    nchgy$
  1176. xchg$:
  1177.     LD    A,(.inc)
  1178.     OR    A
  1179.     JR    NZ,yright$
  1180.     RLC    B
  1181.     BIT    0,B
  1182.     JR    Z,boundy$
  1183.     LD    DE,#0xFFF0
  1184.     ADD    HL,DE    ;Correct screen address
  1185.     JR    boundy$
  1186. yright$:
  1187.     RRC    B
  1188.     BIT    7,B
  1189.     JR    Z,boundy$
  1190.     LD    DE,#0x0010
  1191.     ADD    HL,DE    ;Correct screen address
  1192. boundy$:
  1193.     LD    A,(.d+1)
  1194.     LD    D,A
  1195.     LD    A,(.dinc2+1)
  1196.     ADD    D
  1197.     LD    (.d+1),A
  1198.     LD    A,(.d)
  1199.     LD    D,A
  1200.     LD    A,(.dinc2)
  1201.     ADC    D
  1202.     LD    (.d),A
  1203. nchgy$:
  1204.     POP    DE
  1205.     DEC    E
  1206.     JR    NZ,yloop$
  1207.     LD    A,B
  1208.     CPL
  1209.     LD    C,A
  1210.     JP    .wrbyte
  1211.  
  1212. .yonly::
  1213.     ;; Draw accelerated vertical line
  1214.     LD    A,B    ;check X
  1215.     AND    #7    ;just look at bottom 3 bits
  1216.     PUSH    HL
  1217.     ADD    #0x10    ;Table of bits is located at 0x0010
  1218.     LD    L,A
  1219.     LD    H,#0x00
  1220.     LD    A,(HL)    ;Get mask bit
  1221.     POP    HL
  1222.     LD    B,A
  1223.     CPL
  1224.     LD    C,A
  1225.  
  1226. 1$:    PUSH    DE
  1227.     CALL    .wrbyte
  1228.     INC    HL    ;Correct screen address
  1229.     LD    A,L
  1230.     AND    #0x0F
  1231.     JR    NZ,2$
  1232.     LD    DE,#0x0130
  1233.     ADD    HL,DE
  1234. 2$:    POP    DE
  1235.     DEC    E
  1236.     RET    Z
  1237.     JR    1$
  1238.  
  1239.     ;; Draw a point at (B,C) with mode and color D
  1240. .plot::
  1241.  
  1242.     LD    HL,#.y_table
  1243.     LD    D,#0x00
  1244.     LD    E,C
  1245.     ADD    HL,DE
  1246.     ADD    HL,DE
  1247.     LD    A,(HL+)
  1248.     LD    H,(HL)
  1249.     LD    L,A
  1250.  
  1251.     LD    A,B
  1252.     AND    #0xf8
  1253.     LD    E,A
  1254.     ADD    HL,DE
  1255.     ADD    HL,DE
  1256.  
  1257.     LD    A,B
  1258.  
  1259.     AND     #7
  1260.     ADD     #0x10        ; Table of bits is located at 0x0010
  1261.     LD      C,A
  1262.     LD      B,#0x00
  1263.     LD      A,(BC)
  1264.     LD      B,A
  1265.     CPL
  1266.     LD      C,A
  1267.  
  1268. .wrbyte::
  1269.     .if    0
  1270.     LD    A,(.mod_col)    ; Restore color and mode
  1271.     LD    D,A
  1272.  
  1273.     BIT    5,D
  1274.     JR    NZ,10$
  1275.     BIT    6,D
  1276.     JR    NZ,20$
  1277.     BIT    7,D
  1278.     JR    NZ,30$
  1279.     .else
  1280.     LD    A,(.fg_colour)
  1281.     LD    D,A
  1282.     LD    A,(.draw_mode)
  1283.     CP    #.OR
  1284.     JR    Z,10$
  1285.     CP    #.XOR
  1286.     JR    Z,20$
  1287.     CP    #.AND
  1288.     JR    Z,30$        
  1289.     .endif
  1290.  
  1291.     ; Fall through to SOLID by default
  1292. 1$:
  1293.     ;; Solid
  1294.     LD    E,B
  1295.     .if    0
  1296.     BIT    2,D
  1297.     .else
  1298.     BIT    0,D
  1299.     .endif
  1300.     JR    NZ,2$
  1301.     PUSH    BC
  1302.     LD    B,#0x00
  1303. 2$:
  1304.     .if    0
  1305.     BIT    3,D
  1306.     .else
  1307.     BIT    1,D
  1308.     .endif
  1309.     JR    NZ,3$
  1310.     LD    E,#0x00
  1311. 3$:
  1312.     LDH    A,(.STAT)
  1313.     BIT    1,A
  1314.     JR    NZ,3$
  1315.  
  1316.     LD    A,(HL)
  1317.     AND    C
  1318.     OR    B
  1319.     LD    (HL+),A
  1320.  
  1321.     LD    A,(HL)
  1322.     AND    C
  1323.     OR    E
  1324.     LD    (HL),A
  1325.     LD    A,B
  1326.     OR    A
  1327.     RET    NZ
  1328.     POP    BC
  1329.     RET
  1330.  
  1331. 10$:
  1332.     ;; Or
  1333.     LD      C,B
  1334.     .if    0
  1335.     BIT     2,D
  1336.     .else
  1337.     BIT    0,D
  1338.     .endif
  1339.     JR      NZ,11$
  1340.     LD      B,#0x00
  1341. 11$:
  1342.     .if    0
  1343.     BIT     3,D
  1344.     .else
  1345.     BIT    1,D
  1346.     .endif
  1347.     JR      NZ,12$
  1348.     LD      C,#0x00
  1349. 12$:
  1350.     LDH     A,(.STAT)
  1351.     BIT     1,A
  1352.     JR      NZ,12$
  1353.  
  1354.     LD      A,(HL)
  1355.     OR      B
  1356.     LD      (HL+),A
  1357.  
  1358.     LD      A,(HL)
  1359.     OR      C
  1360.     LD      (HL),A
  1361.     RET
  1362.  
  1363. 20$:
  1364.     ;; Xor
  1365.     LD      C,B
  1366.     .if    0
  1367.     BIT     2,D
  1368.     .else
  1369.     BIT    0,D
  1370.     .endif
  1371.     JR      NZ,21$
  1372.     LD      B,#0x00
  1373. 21$:
  1374.     .if    0
  1375.     BIT     3,D
  1376.     .else
  1377.     BIT    1,D
  1378.     .endif
  1379.     JR      NZ,22$
  1380.     LD      C,#0x00
  1381. 22$:
  1382.     LDH     A,(.STAT)
  1383.     BIT     1,A
  1384.     JR      NZ,22$
  1385.  
  1386.     LD      A,(HL)
  1387.     XOR     B
  1388.     LD      (HL+),A
  1389.  
  1390.     LD      A,(HL)
  1391.     XOR     C
  1392.     LD      (HL),A
  1393.     RET
  1394.  
  1395. 30$:
  1396.     ;; And
  1397.     LD      B,C
  1398.     .if    0
  1399.     BIT     2,D
  1400.     .else
  1401.     BIT    0,D
  1402.     .endif
  1403.     JR      Z,31$
  1404.     LD      B,#0xFF
  1405. 31$:
  1406.     .if    0
  1407.     BIT     3,D
  1408.     .else
  1409.     BIT    1,D
  1410.     .endif
  1411.     JR      Z,32$
  1412.     LD      C,#0xFF
  1413. 32$:
  1414.     LDH     A,(.STAT)
  1415.     BIT     1,A
  1416.     JR      NZ,32$
  1417.  
  1418.     LD      A,(HL)
  1419.     AND     B
  1420.     LD      (HL+),A
  1421.  
  1422.     LD      A,(HL)
  1423.     AND     C
  1424.     LD      (HL),A
  1425.     RET
  1426.  
  1427.     ;; Get color of pixel at point (B,C) returns in A
  1428. .getpix::
  1429.     LD    HL,#.y_table
  1430.     LD    D,#0x00
  1431.     LD    E,C
  1432.     ADD    HL,DE
  1433.     ADD    HL,DE
  1434.     LD    A,(HL+)
  1435.     LD    H,(HL)
  1436.     LD    L,A
  1437.  
  1438.     LD    A,B
  1439.     AND    #0xf8
  1440.     LD    E,A
  1441.     ADD    HL,DE
  1442.     ADD    HL,DE
  1443.  
  1444.     LD    A,B
  1445.  
  1446.     AND     #7
  1447.     ADD     #0x10        ; Table of bits is located at 0x0010
  1448.     LD      C,A
  1449.     LD      B,#0x00
  1450.     LD      A,(BC)
  1451.     LD      C,A
  1452.  
  1453. gp$:
  1454.     LDH    A,(.STAT)
  1455.     BIT    1,A
  1456.     JR    NZ,gp$
  1457.  
  1458.     LD    A,(HL+)
  1459.     LD    D,A
  1460.     LD    A,(HL+)
  1461.     LD    E,A
  1462.     LD    B,#0
  1463.     LD    A,D
  1464.     AND    C
  1465.     JR    Z,npix$
  1466.     SET    0,B
  1467. npix$:    LD    A,E
  1468.     AND    C
  1469.     JR    Z,end$
  1470.     SET    1,B
  1471. end$:    LD    E,B
  1472.     RET
  1473.  
  1474.     ;; Write character C
  1475. .wrtchr::
  1476.     LD    HL,#.y_table
  1477.     LD    D,#0x00
  1478.     LD    A,(.ty)
  1479.     RLCA
  1480.     RLCA
  1481.     RLCA
  1482.     LD    E,A
  1483.     ADD    HL,DE
  1484.     ADD    HL,DE
  1485.     LD    B,(HL)
  1486.     INC    HL
  1487.     LD    H,(HL)
  1488.     LD    L,B
  1489.  
  1490.     LD    A,(.tx)
  1491.     RLCA
  1492.     RLCA
  1493.     RLCA
  1494.     LD    E,A
  1495.     ADD    HL,DE
  1496.     ADD    HL,DE
  1497.  
  1498.     LD    A,C
  1499.     LD    B,H
  1500.     LD    C,L
  1501.  
  1502.     LD    H,D
  1503.     LD    L,A
  1504.     ADD    HL,HL
  1505.     ADD    HL,HL
  1506.     ADD    HL,HL
  1507.  
  1508.     .if    0
  1509.     LD    DE,#.tp1
  1510.     .else
  1511.     .globl    _font_ibm_fixed_tiles
  1512.  
  1513.     LD    DE,#_font_ibm_fixed_tiles
  1514.     .endif
  1515.     
  1516.     ADD    HL,DE
  1517.  
  1518.     LD    D,H
  1519.     LD    E,L
  1520.     LD    H,B
  1521.     LD    L,C
  1522.  
  1523.     .if    0
  1524.     LD    A,(.mod_col)
  1525.     LD    C,A
  1526.     .else
  1527.     LD    A,(.fg_colour)
  1528.     LD    C,A
  1529.     .endif
  1530. chrloop$:
  1531.     LD    A,(DE)
  1532.     INC    DE
  1533.     PUSH    DE
  1534.  
  1535.     .if    1
  1536.     PUSH    HL
  1537.     LD    HL,#.bg_colour
  1538.     LD    L,(HL)
  1539.     .endif
  1540.  
  1541.     LD    B,A
  1542.     XOR    A
  1543.     .if    0
  1544.     BIT    0,C
  1545.     .else
  1546.     BIT    0,L
  1547.     .endif
  1548.     JR    Z,a0$
  1549.     CPL
  1550. a0$:    OR    B
  1551.     .if    0
  1552.     BIT    2,C
  1553.     .else
  1554.     BIT    0,C
  1555.     .endif
  1556.     JR    NZ,a1$
  1557.     XOR    B
  1558. a1$:    LD    D,A
  1559.     XOR    A
  1560.     .if    0
  1561.     BIT    1,C
  1562.     .else
  1563.     BIT    1,L
  1564.     .endif
  1565.     JR    Z,b0$
  1566.     CPL
  1567. b0$:    OR    B
  1568.     .if    0
  1569.     BIT    3,C
  1570.     .else
  1571.     BIT    1,C
  1572.     .endif
  1573.     JR    NZ,b1$
  1574.     XOR    B
  1575. b1$:    
  1576.     LD    E,A
  1577.     .if    1
  1578.     POP    HL
  1579.     .endif
  1580. chrwait$:
  1581.     LDH    A,(.STAT)
  1582.     BIT    1,A
  1583.     JR    NZ,chrwait$
  1584.  
  1585.     LD    A,D
  1586.     LD    (HL+),A
  1587.     LD    A,E
  1588.     LD    (HL+),A
  1589.     POP    DE
  1590.     LD    A,L
  1591.     AND    #0x0F
  1592.     JR    NZ,chrloop$
  1593.     RET
  1594.  
  1595. _gotogxy::
  1596.     LDA    HL,2(SP)    ; Skip return address
  1597.     LD    A,(HL+)        ; A = x
  1598.     LD    (.tx),A
  1599.     LD    A,(HL+)        ; A = y
  1600.     LD    (.ty),A
  1601.     RET
  1602.  
  1603. _wrtchr::
  1604.     PUSH    BC
  1605.  
  1606.     LD    A,(.mode)
  1607.     CP    #.G_MODE
  1608.     CALL    NZ,.gmode
  1609.  
  1610.     LDA    HL,4(SP)    ; Skip return address and registers
  1611.     LD    A,(HL)
  1612.     LD    C,A    ; C = Char to print
  1613.  
  1614.     CALL    .wrtchr
  1615.     CALL    .adv_gcurs
  1616.  
  1617.     POP    BC
  1618.     RET
  1619.  
  1620. _getpix::
  1621.     PUSH    BC
  1622.  
  1623.     LDA    HL,4(SP)    ; Skip return address and registers
  1624.     LD    A,(HL+)    ; B = x
  1625.     LD    B,A
  1626.     LD    A,(HL+)    ; C = y
  1627.     LD    C,A
  1628.  
  1629.     CALL    .getpix
  1630.  
  1631.     POP    BC
  1632.     RET
  1633.  
  1634.     .if    0
  1635. _color::
  1636.     LDA    HL,2(SP)    ; Skip return address and registers
  1637.     LD    A,(HL+)    ; A = Foreground
  1638.     RLCA
  1639.     RLCA
  1640.     OR    (HL)    ; A = Background
  1641.     INC    HL
  1642.     OR    (HL)    ; A = Mode
  1643.     LD    (.mod_col),A
  1644.     RET
  1645.     .else
  1646. _color::
  1647.     LDA    HL,2(SP)    ; Skip return address and registers
  1648.     LD    A,(HL+)    ; A = Foreground
  1649.     LD    (.fg_colour),a
  1650.     LD    A,(HL+)
  1651.     LD    (.bg_colour),a
  1652.     LD    A,(HL)
  1653.     LD    (.draw_mode),a
  1654.     RET
  1655.     .endif    
  1656.  
  1657. _circle::
  1658.     PUSH    BC
  1659.  
  1660.     LD    A,(.mode)
  1661.     CP    #.G_MODE
  1662.     CALL    NZ,.gmode
  1663.  
  1664.     LDA    HL,4(SP)    ; Skip return address and registers
  1665.     LD    A,(HL+)    ; B = x
  1666.     LD    B,A
  1667.     LD    A,(HL+)    ; C = y
  1668.     LD    C,A
  1669.     LD    A,(HL+)    ; D = Radius
  1670.     LD    D,A
  1671.     LD    A,(HL)
  1672.     LD    (.style),A
  1673.  
  1674.     CALL    .circle
  1675.  
  1676.     POP    BC
  1677.     RET
  1678.  
  1679. _box::
  1680.     PUSH    BC
  1681.  
  1682.     LD      A,(.mode)
  1683.     CP      #.G_MODE
  1684.     CALL    NZ,.gmode
  1685.  
  1686.     LDA    HL,4(SP)    ; Skip return address and registers
  1687.     LD    A,(HL+)    ; B = x1
  1688.     LD    (.x_s),A
  1689.     LD    A,(HL+)    ; C = y1
  1690.     LD    (.y_s),A
  1691.     LD    A,(HL+)    ; D = x2
  1692.     LD    (.x_s+1),A
  1693.     LD    A,(HL+)    ; E = y2
  1694.     LD    (.y_s+1),A
  1695.     LD    A,(HL)
  1696.     LD    (.style),A
  1697.     CALL    .box
  1698.     POP    BC
  1699.     RET
  1700.  
  1701. _line::
  1702.     PUSH    BC
  1703.  
  1704.     LD      A,(.mode)
  1705.     CP      #.G_MODE
  1706.     CALL    NZ,.gmode
  1707.  
  1708.     LDA    HL,4(SP)    ; Skip return address and registers
  1709.     LD    A,(HL+)    ; B = x1
  1710.     LD    B,A
  1711.     LD    A,(HL+)    ; C = y1
  1712.     LD    C,A
  1713.     LD    A,(HL+)    ; D = x2
  1714.     LD    D,A
  1715.     LD    A,(HL+)    ; E = y2
  1716.     LD    E,A
  1717.  
  1718.     CALL    .line
  1719.  
  1720.     POP     BC
  1721.     RET
  1722.  
  1723. _plot_point::
  1724.     PUSH    BC
  1725.  
  1726.     LD    A,(.mode)
  1727.     CP    #.G_MODE
  1728.     CALL    NZ,.gmode
  1729.  
  1730.     LDA    HL,4(SP)    ; Skip return address and registers
  1731.     LD    A,(HL+)    ; B = x
  1732.     LD    B,A
  1733.     LD    A,(HL+)    ; C = y
  1734.     LD    C,A
  1735.  
  1736.     CALL    .plot
  1737.  
  1738.     POP    BC
  1739.     RET
  1740.  
  1741.     ;; Old, compatible version of plot()
  1742. _plot::
  1743.     PUSH    BC
  1744.  
  1745.     LD    A,(.mode)
  1746.     CP    #.G_MODE
  1747.     CALL    NZ,.gmode
  1748.  
  1749.     LDA    HL,4(SP)    ; Skip return address and registers
  1750.     LD    A,(HL+)        ; B = x
  1751.     LD    B,A
  1752.     LD    A,(HL+)        ; C = y
  1753.     LD    C,A
  1754.     LD    A,(HL+)        ; colour
  1755.     LD    (.fg_colour),A
  1756.     LD    A,(HL+)        ; mode
  1757.     LD    (.draw_mode),A
  1758.     
  1759.     CALL    .plot
  1760.  
  1761.     POP    BC
  1762.     RET
  1763.     
  1764. _switch_data::
  1765.     PUSH    BC
  1766.  
  1767.     LD    A,(.mode)
  1768.     CP    #.G_MODE
  1769.     CALL    NZ,.gmode
  1770.  
  1771.     LDA    HL,4(SP)    ; Skip return address and registers
  1772.     LD    A,(HL+)    ; B = x
  1773.     LD    B,A
  1774.     LD    A,(HL+)    ; C = y
  1775.     LD    C,A
  1776.     LD    A,(HL+)    ; DE = src
  1777.     LD    E,A
  1778.     LD    A,(HL+)
  1779.     LD    D,A
  1780.     LD    A,(HL+)    ; HL = dst
  1781.     LD    H,(HL)
  1782.     LD    L,A
  1783.  
  1784.     CALL    .switch_data
  1785.  
  1786.     POP     BC
  1787.     RET
  1788.  
  1789.  
  1790. _draw_image::
  1791.     PUSH    BC
  1792.  
  1793.     LD    A,(.mode)
  1794.     CP    #.G_MODE
  1795.     CALL    NZ,.gmode
  1796.  
  1797.     LDA    HL,4(SP)    ; Skip return address and registers
  1798.     LD    A,(HL+)    ; HL = data
  1799.     LD    C,A
  1800.     LD    B,(HL)
  1801.  
  1802.     CALL    .draw_image
  1803.  
  1804.     POP    BC
  1805.     RET
  1806.  
  1807.     .area   _DATA
  1808.  
  1809. .y_table::
  1810.     .word   0x8100,0x8102,0x8104,0x8106,0x8108,0x810A,0x810C,0x810E
  1811.     .word   0x8240,0x8242,0x8244,0x8246,0x8248,0x824A,0x824C,0x824E
  1812.     .word   0x8380,0x8382,0x8384,0x8386,0x8388,0x838A,0x838C,0x838E
  1813.     .word   0x84C0,0x84C2,0x84C4,0x84C6,0x84C8,0x84CA,0x84CC,0x84CE
  1814.     .word   0x8600,0x8602,0x8604,0x8606,0x8608,0x860A,0x860C,0x860E
  1815.     .word   0x8740,0x8742,0x8744,0x8746,0x8748,0x874A,0x874C,0x874E
  1816.     .word   0x8880,0x8882,0x8884,0x8886,0x8888,0x888A,0x888C,0x888E
  1817.     .word   0x89C0,0x89C2,0x89C4,0x89C6,0x89C8,0x89CA,0x89CC,0x89CE
  1818.     .word   0x8B00,0x8B02,0x8B04,0x8B06,0x8B08,0x8B0A,0x8B0C,0x8B0E
  1819.     .word   0x8C40,0x8C42,0x8C44,0x8C46,0x8C48,0x8C4A,0x8C4C,0x8C4E
  1820.     .word   0x8D80,0x8D82,0x8D84,0x8D86,0x8D88,0x8D8A,0x8D8C,0x8D8E
  1821.     .word   0x8EC0,0x8EC2,0x8EC4,0x8EC6,0x8EC8,0x8ECA,0x8ECC,0x8ECE
  1822.     .word   0x9000,0x9002,0x9004,0x9006,0x9008,0x900A,0x900C,0x900E
  1823.     .word   0x9140,0x9142,0x9144,0x9146,0x9148,0x914A,0x914C,0x914E
  1824.     .word   0x9280,0x9282,0x9284,0x9286,0x9288,0x928A,0x928C,0x928E
  1825.     .word   0x93C0,0x93C2,0x93C4,0x93C6,0x93C8,0x93CA,0x93CC,0x93CE
  1826.     .word   0x9500,0x9502,0x9504,0x9506,0x9508,0x950A,0x950C,0x950E
  1827.     .word   0x9640,0x9642,0x9644,0x9646,0x9648,0x964A,0x964C,0x964E
  1828.  
  1829.     .if 0
  1830. .tp1:
  1831.     .include    "ibmpc1.h"
  1832. .endtp1:
  1833.     .endif
  1834.